package com.exrobot.module.rbt.service.order;

import java.util.*;

import com.exrobot.module.rbt.controller.admin.orderitem.vo.OrderItemPageReqVO;
import com.exrobot.module.rbt.dal.dataobject.orderitem.OrderItemDO;
import com.exrobot.module.rbt.service.robotScheduler.RobotFood;
import jakarta.validation.*;
import com.exrobot.module.rbt.controller.admin.order.vo.*;
import com.exrobot.module.rbt.dal.dataobject.order.OrderDO;
import com.exrobot.framework.common.pojo.PageResult;

/**
 * 订单信息 Service 接口
 *
 * @author 超级管理员
 */
public interface OrderService {

    /**
     * 实时配送订单绑定商品绑定信息
     *
     * @param saleFoodDOList 信息
     * @return 编号
     */
    void bindOrderMenu(List<OrderItemDO> saleFoodDOList);
    /**
     * 创建订单信息
     *
     * @param createReqVO 创建信息
     * @return 编号
     */
    OrderDO createOrder(@Valid OrderSaveReqVO createReqVO);

    void insertBatchOrderItem(List<OrderItemDO> list);

    /**
     * 更新订单信息
     *
     * @param updateReqVO 更新信息
     */
    void updateOrder(@Valid OrderSaveReqVO updateReqVO);

    /**
     * 更新订单子表信息
     *
     * @param itemIds 集合
     */
    void updateOrderItemStatus(List<Long> itemIds,Integer oldStatus,Integer newStatus);

    void updateOrderItemTask(List<Long> itemIds,String taskNo,String robotSn,Integer status);

    void updateOrderItemTaskBySn(String orderSn, String taskNo,String robotSn,Integer status);

    /**
     * 删除订单信息
     *
     * @param id 编号
     */
    void deleteOrder(Long id);

    /**
    * 批量删除订单信息
    *
    * @param ids 编号
    */
    void deleteOrderListByIds(List<Long> ids);

    /**
     * 获得订单信息
     *
     * @param id 编号
     * @return 订单信息
     */
    OrderDO getOrder(Long id);

    /**
     * 获得订单信息
     *
     * @param orderSn 编号
     * @return 订单信息
     */
    OrderDO getOrderBySn(String orderSn);

    OrderDO matchToDayOrderAndUpdate(String robotSn,List<OrderItemDO> itemDOS);

    /**
     * 获得当天机器人销售的订单
     *
     * @param robotSn 编号
     * @return 订单信息
     */
    List<OrderRespVO> getTodayOrderVOByRobotSn(String robotSn,String taskNo);


    /**
     * 获得订单信息分页
     *
     * @param pageReqVO 分页查询
     * @return 订单信息分页
     */
    PageResult<OrderDO> getOrderPage(OrderPageReqVO pageReqVO);

    List<OrderDO> getOrderList(OrderPageReqVO pageReqVO);

    /**
     * 更新订单完成
     *
     * @param robotSn 机器人SN
     * @param code 验证码
     */
    OrderDO updateOrderCompleted(String robotSn,String code);

    /**
     * 更新订单绑定机器人餐盒
     *
     * @param reqVO 订单信息
     */
    OrderDO updateOrderBindRobotbox(OrderSaveReqVO reqVO);

    void updateOrderChange(String sn,List<String> codes);

    List<RobotFood> getRobotSalseFoodByToday();

    List<OrderItemDO> getOrderItemList(OrderItemPageReqVO reqVO);




//    @Override
//    public List<SaleFoodDO> assignOrderToRobot(SaleOrder order, List<String> sns) {
//        LocalDate today = LocalDate.now();
//        LocalDateTime startTime = LocalDateTime.of(today, LocalTime.MIN);
//        LocalDateTime endTime = LocalDateTime.of(today, LocalTime.MAX);
//        for(SaleOrderItem item : order.getItems()) {
//            LambdaUpdateWrapper<SaleFoodDO> updateWrapper = new LambdaUpdateWrapper<>();
//            updateWrapper.in(SaleFoodDO::getRobotSn,sns)
//                    .between(SaleFoodDO::getMealDate,startTime,endTime)
//                    .eq(SaleFoodDO::getStatus,RbtSaleFoodStatusEnum.SALE.getVal())
//                    .eq(SaleFoodDO::getMenuSn,item.getFoodId())
//                    .set(SaleFoodDO::getOrderId,order.getId())
//                    .set(SaleFoodDO::getCode,order.getCode())
//                    .set(SaleFoodDO::getPoint,order.getPoint())
//                    .set(SaleFoodDO::getStatus,RbtSaleFoodStatusEnum.ORDER.getVal())
//                    .last("ORDER BY robotBoxSn ASC LIMIT "+item.getNum());
//            saleFoodMapper.update(null,updateWrapper);
//        }
//        List<SaleFoodDO> list = saleFoodMapper.selectList(SaleFoodDO::getOrderId,order.getId(),SaleFoodDO::getStatus,RbtSaleFoodStatusEnum.SALE.getVal());
//        sendMealCode(list);
//        return list;
//    }

}